# Numpy是用于快速数组计算的优化库。因此，简单地访问每个像素值并对其进行修改将非常缓慢，因此不建议使用
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt

# 加载彩色图像
img = cv.imread("test.jpg")
# 访问像素值
px = img[100, 100]
print(px)
# 仅访问蓝色像素
blue = img[100, 100, 0]
print(blue)
# 修改像素值
img[100, 100] = [255, 255, 255]
print(img[100, 100])

# 注意 上面的方法通常用于选择数组的区域，例如前5行和后3列。对于单个像素访问，Numpy数组方法array.item()和array.itemset())被认为更好，但是它们始终返回标量。如果要访问所有B，G，R值，则需要分别调用所有的array.item()。
# 访问 RED 值
print(img.item(10, 10, 2))
# 修改 RED 值
img.itemset((10, 10, 2), 100)
print(img.item(10, 10, 2))
# 访问图像属性，包括行数，列数和通道数，图像数据类型，像素数等
# 图像的形状可通过img.shape访问。它返回行，列和通道数的元组（如果图像是彩色的）
print(img.shape)  # 注意 如果图像是灰度的，则返回的元组仅包含行数和列数，因此这是检查加载的图像是灰度还是彩色的好方法
# 像素总数
print(img.size)
# 图像数据类型通过img.dtype
print(img.dtype)
# 图像感兴趣区域ROI
ball = img[0:200, 420:620]  # 感兴趣区域ROI起始坐标位置（[y1:y2,x1,x2]）
img[10:210, 10:210] = ball  # 感兴趣区域ROI新坐标位置

plt.imshow(img[:, :, ::-1])
plt.show()
